home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Games of Daze
/
Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso
/
x2ftp
/
msdos
/
utils
/
pcxutils
/
pcxview.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-07-14
|
3KB
|
159 lines
/**************************************************************************
PCXVIEW - by Lee Hamel (Patch), hamell@cx.pdx.edu, *Avalanche* coder
July 14th, 1993
**************************************************************************/
#include <stdio.h>
typedef struct {
char manufacturer;
char version;
char encoding;
char bits_per_pixel;
int xmin,ymin;
int xmax,ymax;
int hres;
int vres;
char palette[48];
char reserved;
char colour_planes;
int bytes_per_line;
int palette_type;
char filler[58];
} PCXHEAD;
PCXHEAD header;
unsigned int width,depth;
unsigned int bytes;
unsigned char palette[768];
FILE *fp;
void Read_PCX_Line(unsigned int vidoffset)
{
unsigned char c, run;
unsigned int n = 0;
_asm
{
cld
mov di,[vidoffset]
}
do
{
c = fgetc(fp) & 0xff;
/* if it's a run of bytes field */
if ((c & 0xc0) == 0xc0)
{
/* and off the high bits */
run = c & 0x3f;
/* get the run byte */
c = fgetc(fp);
/* run the byte */
n += run;
_asm
{
mov ax,0a000h
mov es,ax
mov al,[c]
xor ch,ch
mov cl,[run]
rep stosb
}
}
else
{
n++;
_asm
{
mov ax,0a000h
mov es,ax
mov al,[c]
stosb
}
}
}
while (n < bytes);
}
void Unpack_PCX_File(void)
{
int i;
for (i = 0; i < 768; i++)
palette[i] = palette[i] >> 2;
_asm { mov ax,0013h
int 10h
mov ax,1012h
xor bx,bx
mov cx,256
mov dx,offset palette
int 10h
}
/*
_asm {
cld
mov ax,0a000h
mov es,ax
xor di,di
xor al,al
mov ah,200
banger: mov cx,320
rep stosb
inc al
dec ah
jnz banger
}
*/
for (i = 0; i < depth; i++)
Read_PCX_Line(i * 320);
_asm { xor ax,ax
int 16h
mov ax,0003h
int 10h
}
}
void main(int argc, char *argv[])
{
if (argc > 1)
{
if ((fp = fopen(argv[1],"rb")) != NULL)
{
if (fread((char *)&header,1,sizeof(PCXHEAD),fp) == sizeof(PCXHEAD))
{
if (header.manufacturer == 0x0a && header.version == 5)
{
if (!fseek(fp,-769L,SEEK_END))
{
if (fgetc(fp) == 0x0c && fread(palette,1,768,fp) == 768)
{
fseek(fp,128L,SEEK_SET);
width = header.xmax - header.xmin + 1;
depth = header.ymax - header.ymin + 1;
bytes = header.bytes_per_line;
/*
printf("Width = %d\n",width);
printf("Depth = %d\n",depth);
printf("Bytes = %d\n",bytes);
*/
Unpack_PCX_File();
}
else printf("Error reading palette\n");
}
else printf("Error seeking to palette\n");
}
else printf("Not a 256 color PCX file\n");
}
else printf("Error reading %s\n",argv[1]);
fclose(fp);
}
else printf("Error opening %s\n",argv[1]);
}
}